#ifndef MPHTTPREQUESTFILECONTENT_H
#define MPHTTPREQUESTFILECONTENT_H

/*****************************************
 * HttpRequestFileContent 继承于 HttpRequestContent
 *****************************************/

#include <fstream>

#include "mpHttpParams.h"
#include "mpHttpRequestMessage.h"

namespace MP{
namespace HTTP{
namespace INTERNAL{

class HttpRequestFileContent : public HttpRequestContent
{
public:
    HttpRequestFileContent(const std::string& filePath,
                           std::size_t fileOffset,
                           std::size_t sendContentSize);
    HttpRequestFileContent(const std::string& filePath,
                           std::size_t fileOffset,
                           std::size_t sendContentSize,
                           const std::string & httpcontent_type);
    ~HttpRequestFileContent() override = default;


    //重写父类函数
    virtual std::string getMd5() override;
    virtual std::size_t getContentLength() override;
    //（如果返回Fasle表示数据存在异常）
    virtual bool beginWriteData() override;
    //如果返回真，则表示仍有数据需要写入；如果返回假，则表示当前数据写入完成后则Payload写入完毕
    virtual bool onWriteDataSome(std::vector<boost::asio::const_buffer> & buffers) override;
    virtual void endWriteData()override;

private:
    std::string _filePath;                      //待发送文件路径
    std::size_t _fileOffset;                    //发送文件的起始位置
    std::size_t _sendContentSize;               //发送文件的大小（有可能仅上传文件部分内容）
    std::size_t _sendContentTrueSize=0;         //发送文件的真实大小（该值即getContentLength函数返回值，通过文件大小和_fileOffset、_sendContentSize计算得到）

    std::streamsize _unreadSize;
    std::ifstream _read_file;

    char _buf[MP::HTTP::READ_FILE_BUF_SIZE]={}; //用于读取数据的数组

};  //HttpRequestFileContent



}   //INTERNAL
}   //HTTP
}   //MP


#endif // MPHTTPREQUESTFILECONTENT_H
